perm filename HENET.H[11,HE] blob sn#690538 filedate 1982-12-08 generic text, type T, neo UTF8
/*      enet.h  CMU     1/18/80 */

/*
 *  Ethernet definitions needed for user processes
 *
 **********************************************************************
 * HISTORY
 * 10-Aug-82  Mike Accetta (mja) at Carnegie-Mellon University
 *	Added EIOCMBIS and EIOCMBIC definitions, and new ENHOLDSIG mode
 *	bit and ENPRIVMODES defintions (V3.05e).
 *
 * 15-Jan-82  Mike Accetta (mja) at Carnegie-Mellon University
 *	Changed ENPACKETSIZE to 560 from 300 and ENMAXPACKETS to 50 from 100
 *	(V3.04a).
 *
 * 15-Jan-82  Mike Accetta (mja) at Carnegie-Mellon University
 *	Expanded to a maximum of 32 ethernet devices from previous maximum of
 *	16 (V3.03e).
 *
 * 30-Nov-81  Mike Accetta (mja) at Carnegie-Mellon University
 *	Added SigPid field to open descriptor (V3.03d).
 *
 * 24-Nov-81  Mike Accetta (mja) at Carnegie-Mellon University
 *	Added counts for queued and dropped packets on input and sent and
 *	dropped packets on output to the state structure (V3.03c).
 *
 * 07-Oct-81  Mike Accetta (mja) at Carnegie-Mellon University
 *	Substantially rewritten for 4.1BSD and incorporating most ideas
 *	from previous changes by Bob Fitzgerald and Jeff Mogul (V3.03a).
 *
 * 12-Aug-81  Bob Fitzgerald (rpf) at Carnegie-Mellon University
 *	Added DEFWAITING, MINSCAVENGE, EIOCSETW, EIOCFLSH, EIOCSTAT,
 *	struct eniosb, QueueShort and QueueLong with associated
 *	constants.  Modified structs OpenDescriptor and QueueElt.
 *	Following Jeff Mogul@Stanford, split packets into separate
 *	free queues for transmitter and receiver so as to map each
 *	packet onto the unibus only once.  Converted State element
 *      of OpenDescriptor to enumeration and renamed it RecvState.
 *
 * 23-Apr-81  Mike Accetta (mja)) at Carnegie-Mellon University
 *	Moved some structure declarations from enet.c to make them
 *	avialable to pstat (V2.00g).
 *
 * 03-Jul-80  Mike Accetta (mja) at Carnegie-Mellon University
 *	Added EIOCENBS and EIOCINHS definitions (V1.07f).
 *
 * 27-Feb-80  Mike Accetta (mja) at Carnegie-Mellon University
 *	Added EIOCGETP, EIOCSETP, EIOCSETF, HIPRIDEV, and HIPRI
 *	definitions (V1.05a).
 *
 * 22-Feb-80  Rick Rashid (rfr) at Carnegie-Mellon University
 *	Rewritten for multiple simultaneous opens with filters (V1.05).
 *
 * 18-Jan-80  Mike Accetta (mja) at Carnegie-Mellon University
 *      Created (V1.00).
 *
 **********************************************************************
 */

#ifdef	KERNEL

/* tunable constants */
#define ENMAXOPENS	32		/* # of enet devices */
#define ENINDEXBITS	5		/* [ LOG2(ENMAXOPENS) ] */
#define ENINDEXMASK	(ENMAXOPENS-1)	/* mask bits for minor device index */
#define	ENHIPRIDEV	28		/* lowest high priority device */
#define	ENHIPRI		128		/* high priority priority */
#define	ENMAXPRI	255		/* maximum high priority priority */

#define	ENUNIT(dev)	(enUnit[(u_char)minor(dev)>>ENINDEXBITS]) /* macro */
					/* to extract ethernet unit number */
					/* from device number (used as the */
					/* index into the enState[] table); */
					/* this goes indirect through */
					/* enUnit[] so that user software is */
					/* insulated from the physical unit */
					/* number */
#define	ENINDEX(dev)	(minor(dev)&ENINDEXMASK) /* macro to extract logical */
					/* device index from device number */
					/* (used as the index into the */
					/* AllDescriptors table for the */
					/* unit) */

#define ENPACKETSIZE	560		/* max size of packet in short words */
#define ENMAXWAITING	8		/* maximum number of packets */
					/* which can be queued at one time */
					/* for an open enet file (max 256) */
#define ENDEFWAITING	2		/* default number of packets */
					/* which can be queued at one */
					/* time for an open enet file */
#define ENPACKETS	50		/* number of preallocated packets */
					/* available for sending and */
					/* receiving (these should be allocated */
					/* dynamically once the system makes */
					/* this more feasible) */
#define	ENXPACKETS	3		/* maximum number of packets from free */
					/* queue to be allocated for transmitting */
#define ENMINSCAVENGE	4		/* minimum number of packets */
					/* guaranteed to be freed by */
					/* scavenging */

#define ENUBAALLOCSIZE	((2*ENPACKETSIZE)+NBPG-1)/* size of packet mapped */
					/* onto UNIBUS (extended by one page */
					/* to allow for remapping at */
					/* arbitrary byte offsets) */

#define	ENADDR	((struct enreg *)(ui->ui_addr)) /* macro to address the */
					/* device registers of the current */
					/* ethernet unit */

/*
 *  Privileged mode bits
 */
#define	ENKERNEL	(0x8000)	/* flag bit to indicate kernel mode */
					/*  requests */


/*
 *  The following definitions are meant to clean up
 *  C language syntax a bit.
 */

typedef	enum {false, true}	boolean;
#define	TRUE	((int)true)
#define	FALSE	((int)false)

#define endcase break;

/*
 *  The ethernet packet structure.
 *
 */

struct enPacket
{
    struct Queue   enP_Link;		/* queue pointers */
    int 	 (*enP_Func)();		/* finish processing function */
    u_short	  *enP_Data;		/* pointer to start of packet */
    short          enP_WordCount;	/* 16 bit words in Data */
    u_short	   enP_RefCount;	/* # of outstanding references to */
					/* this packet */
};
#define	enP_F	enP_Link.F
#define	enP_B	enP_Link.B

/*
 *  Ethernet queue header
 */
struct enQueue
{
    struct Queue enQ_Head;		/* queue header and trailer pointers */
    u_short	 enQ_NumQueued;		/* number of elements in queue */
};
#define	enQ_F	enQ_Head.F
#define	enQ_B	enQ_Head.B

/*
 *  Wait queue header
 */
struct enWaitQueue
{
    struct enPacket *enWQ_Packets[ENMAXWAITING];/* pointers to queued packets */
    char	     enWQ_Head;		/* index into Packets (for dequeue) */
    char	     enWQ_Tail;		/* index into Packets (for enqueue) */
    u_char	     enWQ_NumQueued;	/* current queue size */
    u_char	     enWQ_MaxWaiting;	/* threshold for additions */
};
#define	enNextWaitQueueIndex(idx)					\
	if (++(idx) >= ENMAXWAITING) (idx) = 0
#define	enPrevWaitQueueIndex(idx)					\
	if (--(idx) < 0) (idx) = (ENMAXWAITING-1)

#endif

#define ENMAXFILTERS	40		/* maximum filter short words */

/*
 *  filter structure for SETF
 */
struct enfilter
{
    u_char  enf_Priority;		/* priority of filter (obsolete */
					/* for normal priority filters) */
    u_char  enf_FilterLen;		/* length of filter command list */
    u_short enf_Filter[ENMAXFILTERS];	/* the filter command list */
};

#ifdef	KERNEL

/*
 *  States of receive side of open enet file.
 */
enum enStates {ENRECVIDLE, ENRECVTIMING, ENRECVTIMEDOUT};

struct enOpenDescriptor
{
    struct Queue       enOD_Link;	/* Linked list of OpenDescriptors */
    struct enWaitQueue enOD_Waiting;	/* fixed Queue of waiting packets */
    union
    {
	struct proc   *enODun_SigProc;	/* Process to signal (user mode) */
	int 	     (*enODun_SigFunc)();/* Function to call (kernel mode) */
    }		       enOD_un;
    short	       enOD_SigPid;	/* Process ID of process to signal */
    short    	       enOD_SigNumb;	/* Signal number for input packet */
					/* notification (if >= NSIG then */
					/* kernel mode acces) */
    short              enOD_Timeout;	/* Length of time to wait for packet */
    struct enfilter    enOD_OpenFilter;	/* Packet filter */
    enum enStates      enOD_RecvState;	/* see enStates enumeration (above) */
    short	       enOD_Flag;	/* Kernel and user mode option bits */
};
#define	enOD_SigProc	enOD_un.enODun_SigProc
#define	enOD_SigFunc	enOD_un.enODun_SigFunc

/*
 *  State descriptor for each enet device
 */
struct enState
{
    long	ens_Rcnt;		/* input packets queued since */
					/* system startup */
    long	ens_Xcnt;		/* output packets sent since */
					/* system startup */
    long	ens_Rdrops;		/* input packets dropped since */
					/* system startup */
    long	ens_Xdrops;		/* output packets dropped since */
					/* system startup */
    u_short	ens_Rerrors;		/* input error count since system
					/* startup */
    u_short	ens_Xerrors;		/* output error count since system */
					/* startup */
    u_short	ens_Rand;		/* pseudo random number for */
					/* transmit backoff */
    u_short	ens_XmitqMax;		/* minimum transmit freeq size */
    u_short	ens_Mask;		/* mask for transmit backoff */
    u_char	ens_OpenFlag[ENMAXOPENS];/* (enopf[i] != 0) iff device */
				 	/* is open */
    struct enOpenDescriptor		/* state array for open enet */
	        ens_AllDescriptors[ENMAXOPENS]; /* files */
    struct enQueue			/* queue of active open */
		ens_Desq;		/* file descriptors */
    struct enQueue			/* queue of packets waiting to */
		ens_Xmitq;		/* be transmitted */
    struct enPacket			/* packet currently being */
	       *ens_XP;			/* transmitted (NULL ==> inactive) */
    struct enPacket			/* packet currently being received */
	       *ens_RP;			/* (NULL ==> inactive) */
    int		ens_Xinfo;		/* transmit UBA resources */
    int		ens_Rinfo;		/* receive UBA resources */
};
#define	enRcnt		(enStatep->ens_Rcnt)
#define	enXcnt		(enStatep->ens_Xcnt)
#define	enRdrops	(enStatep->ens_Rdrops)
#define	enXdrops	(enStatep->ens_Xdrops)
#define	enRerrors	(enStatep->ens_Rerrors)
#define	enXerrors	(enStatep->ens_Xerrors)
#define	enRand		(enStatep->ens_Rand)
#define	enXmitqMax	(enStatep->ens_XmitqMax)
#define	enMask		(enStatep->ens_Mask)
#define	enOpenFlag	(enStatep->ens_OpenFlag)
#define	enAllDescriptors (enStatep->ens_AllDescriptors)
#define	enDesq		(enStatep->ens_Desq)
#define	enCurOpens	(enStatep->ens_Desq.enQ_NumQueued)
#define	enXmitq		(enStatep->ens_Xmitq)
#define	enXP		(enStatep->ens_XP)
#define	enRP		(enStatep->ens_RP)
#define	enXinfo		(enStatep->ens_Xinfo)
#define	enRinfo		(enStatep->ens_Rinfo)

/*
 *  Structure of device register
 */
struct enreg
{
    short enxwc;
    short enxba;
    short enxcsr;
    short enxdly;
    short enrwc;
    short enrba;
    short enrcsr;
    short enaddr;
};

/*  status bits in csr  */
#define ENCSR_ERR	0100000
#define ENCSR_IE	0100
#define ENCSR_PROM	02		/* promiscuous mode (currently unused) */
#define ENCSR_GO	01

#endif

/*  set/get parameters, set filter ioctl commands  */
#define	EIOCSETP	(('E'<<8)|100)
#define	EIOCGETP	(('E'<<8)|101)
#define	EIOCSETF	(('E'<<8)|102)
#define	EIOCENBS	(('E'<<8)|103)
#define	EIOCINHS	(('E'<<8)|104)
#define EIOCSETW	(('E'<<8)|105)
#define EIOCFLUSH	(('E'<<8)|106)
#define EIOCALLOCP	(('E'<<8)|107)
#define EIOCDEALLOCP	(('E'<<8)|108)
#define EIOCMBIS	(('E'<<8)|109)
#define EIOCMBIC	(('E'<<8)|110)

/*
 *  Bits in mode word modified by EIOCMBIS and EIOCMBIC.
 */
#define	ENHOLDSIG	(0x0001)	/* don't disable signal after sending */
#define	ENPRIVMODES	(~(ENHOLDSIG))

/*
 *  We now allow specification of up to MAXFILTERS (short) words of a filter
 *  command list to be applied to incoming packets to determine if
 *  those packets should be given to a particular open ethernet file.
 *  
 *  Each open enet file specifies the filter command list via iocontrl.
 *  Each filter command list specifies a sequences of actions which leave a
 *  boolean value on the top of an internal stack.  Each word of the
 *  command list specifies an action from the set {PUSHLIT, PUSHZERO,
 *  PUSHWORD+N} which respectively push the next word of the stack, zero,
 *  or word N of the incoming packet on the stack, and a binary operator
 *  from the set {EQ, LT, LE, GT, GE, AND, OR, XOR} which operates on the
 *  top two elements of the stack and replaces them with its result.  The
 *  special action NOPUSH and the special operator NOP can be used to only
 *  perform the binary operation or to only push a value on the stack.
 *  
 *  If the final value of the filter operation is true, then the packet is
 *  accepted for the open file which specified the filter.
 *  
 */

/*  these must sum to 16!  */
#define	ENF_NBPA	10			/* # bits / action */
#define	ENF_NBPO	6			/* # bits / operator */

/*  binary operators  */
#define ENF_NOP	(0<<ENF_NBPA)
#define	ENF_EQ	(1<<ENF_NBPA)
#define	ENF_LT	(2<<ENF_NBPA)
#define	ENF_LE	(3<<ENF_NBPA)
#define	ENF_GT	(4<<ENF_NBPA)
#define ENF_GE	(5<<ENF_NBPA)
#define	ENF_AND	(6<<ENF_NBPA)
#define	ENF_OR	(7<<ENF_NBPA)
#define	ENF_XOR	(8<<ENF_NBPA)

/*  stack actions  */
#define	ENF_NOPUSH	0
#define	ENF_PUSHLIT	1	
#define	ENF_PUSHZERO	2
#define	ENF_PUSHWORD	16

/*
 *  parameter buffer structure for GETP and SETP
 */
struct eniocb
{
    u_char  en_addr;		/* ethernet address (RO) */
    u_char  en_maxfilters;	/* max filter words available (RO) */
    u_char  en_maxwaiting;	/* max queued input packets (RO) */
    u_char  en_maxpriority;	/* max filter priority for this file (RO) */
    short   en_rtout;		/* receive timeout in (jiffies) (RW) */
    short   en_pad1;		/* (unused; must be zero) */
};